package com.rayframework.http.lang.response;


import com.rayframework.http.lang.enums.HttpStatus;

/**
 * 数据响应结果 - 开放接口层【并非Web层】
 * <p>
 * update - 20231024 翻新
 * 不需要set方法，使用构造方法去创建对象
 *
 * @author LiaoYuXing-Ray
 * @version 1.0
 * @createDate 2023/9/5 20:23
 **/
@SuppressWarnings("unused")
public class RayResponse<T> {
    /**
     * 状态码 {@link HttpStatus}
     * 2023/10/24 10:52
     */
    private int code;
    /**
     * 返回信息 {@link HttpStatus}
     * 2023/10/24 10:52
     */
    public String message;
    /**
     * 返回数据 2023/9/8 9:49
     */
    public T data;

    /**
     * 服务器当前时间 2023/9/8 10:41
     */
    public final long now = System.currentTimeMillis();

    public RayResponse() {
    }


    /**
     * 构造方法 - 全参
     *
     * @param data 失败的数据
     * @author LiaoYuXing-Ray 2023/10/24 10:54
     **/
    public RayResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 获取状态码的方法
     *
     * @return int 状态码{@link HttpStatus}
     * @author LiaoYuXing-Ray 2023/10/24 11:24
     **/
    public int getCode() {
        return code;
    }


    /**
     * 获取返回信息的方法
     *
     * @return String 返回信息{@link HttpStatus}
     * @author LiaoYuXing-Ray 2023/10/24 11:24
     **/
    public String getMessage() {
        return message;
    }


    /**
     * 获取返回数据的方法
     *
     * @return 数据信息
     * @author LiaoYuXing-Ray 2023/10/24 11:24
     **/
    public T getData() {
        return data;
    }


    /**
     * 返回成功的结果 - 重载【常用】
     * 如果只传了数据，默认返回成功结果
     *
     * @param data 数据
     * @return {@link RayResponse}
     */
    public static RayResponse<Object> success(Object data) {
        // 默认状态码为200 默认“OK”
        return success(HttpStatus.OK.value(), HttpStatus.OK.getReasonPhrase(), data);
    }

    /**
     * 返回成功的结果
     *
     * @param code    状态码
     * @param message 返回信息
     * @param data    返回数据
     * @return {@link RayResponse}
     */
    public static RayResponse<Object> success(int code, String message, Object data) {
        return new RayResponse<>(code, message, data);
    }


    /**
     * 返回失败的结果 - 重载
     * 如果只传了数据，默认返回400
     * <br>
     * 全局异常只处理400的情况 {@link HttpStatus#BAD_REQUEST}
     *
     * @param message 错误信息
     * @return {@link RayResponse}
     */
    public static RayResponse<Object> fail(String message) {
        return fail(HttpStatus.BAD_REQUEST.value(), message, null);
    }

    /**
     * 返回失败的结果
     *
     * @param code    状态码
     * @param message 返回信息
     * @param data    返回数据
     * @return {@link RayResponse}
     */
    public static RayResponse<Object> fail(int code, String message, Object data) {
        return new RayResponse<>(code, message, data);
    }

}
